Что такое constraints (CHECK, UNIQUE, NOT NULL) в PostgreSQL?
Что такое constraints
Constraints (ограничения целостности) — это правила, которые база данных применяет к столбцам или таблицам, чтобы данные всегда оставались корректными. Если операция INSERT или UPDATE нарушает ограничение, PostgreSQL откатывает её и возвращает ошибку. Это защита данных на уровне СУБД, а не приложения — она работает всегда, независимо от того, из какого сервиса пришёл запрос.
NOT NULL
Запрещает хранить NULL в столбце. Полезно для полей, которые обязательно должны иметь значение, например email или id.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT NOT NULL
);
Попытка вставить строку без email завершится ошибкой null value in column "email" violates not-null constraint.
UNIQUE
Гарантирует, что значения в столбце (или комбинации столбцов) не повторяются среди всех строк таблицы. Под капотом PostgreSQL создаёт уникальный индекс, поэтому UNIQUE ещё и ускоряет поиск по этому столбцу.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT UNIQUE
);
Важный нюанс: NULL не считается равным другому NULL, поэтому UNIQUE-столбец может содержать сколько угодно строк со значением NULL.
CHECK
Проверяет произвольное булево выражение для значения строки. Позволяет задать бизнес-правило прямо в схеме БД.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
price NUMERIC CHECK (price > 0),
discount NUMERIC CHECK (discount >= 0 AND discount <= 100)
);
CHECK может ссылаться на несколько столбцов одной строки, например CHECK (end_date > start_date).
Именование ограничений
Ограничениям можно (и рекомендуется) давать явные имена — это упрощает диагностику ошибок и последующее изменение через ALTER TABLE:
ALTER TABLE products
ADD CONSTRAINT price_positive CHECK (price > 0);
Как ведут себя constraints
- Проверяются на каждой вставке и обновлении затронутого столбца.
- При нарушении транзакция (или конкретная операция) откатывается с понятной ошибкой.
- UNIQUE и PRIMARY KEY реализованы через индексы, поэтому они не только проверяют данные, но и ускоряют выборки и JOIN по этим столбцам.
- Можно комбинировать несколько constraints на одном столбце:
email TEXT NOT NULL UNIQUE.
Зачем это нужно на практике
Constraints переносят часть валидации из кода приложения в БД. Даже если в приложении есть баг или прямой доступ к базе выполняет другой сервис, некорректные данные просто не попадут в таблицу. Это особенно важно в системах, где с одной базой работает несколько независимых сервисов.
Что хочет услышать интервьюер
Кандидат понимает, что constraints — это ограничения целостности на уровне БД, а не приложения
Может объяснить разницу между NOT NULL, UNIQUE и CHECK своими словами
Знает, что UNIQUE реализуется через индекс и допускает несколько NULL
Приводит пример синтаксиса CREATE TABLE или ALTER TABLE с constraint
Понимает, что нарушение constraint приводит к ошибке и откату операции
Пример: Таблица с NOT NULL, UNIQUE и CHECK
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
age INTEGER CHECK (age >= 0)
);
-- добавление именованного ограничения к существующей таблице
ALTER TABLE users
ADD CONSTRAINT age_reasonable CHECK (age < 150);
Типичные ошибки
Считают, что UNIQUE запрещает более одного NULL в столбце
Путают CHECK с триггерами или валидацией только на уровне приложения
Забывают, что PRIMARY KEY — это фактически NOT NULL + UNIQUE вместе
Не знают, что constraints можно добавлять и удалять через ALTER TABLE после создания таблицы
Не упоминают, что UNIQUE и PRIMARY KEY создают индекс и влияют на производительность


